/*
 * TestArchivo.cpp
 *
 *  Created on: 18/04/2014
 *      Author: manuel
 */

#include "TestArchivo.h"

TestArchivo::TestArchivo() {}

TestArchivo::~TestArchivo() {}

int testEscribirByteCorrectamente() {
	Archivo archivo("bytesTest.txt"); archivo.abrir();
	Byte byte0("1001101"); // 1001101 = 77 = M

	archivo.escribirByte(byte0);

	byte0.resetear();

	byte0.push_bits("1100001");

	archivo.escribirByte(byte0);

	byte0.resetear();

	byte0.push_bits("1110");
	byte0.push_bits("110");

	archivo.escribirByte(byte0);

	if( byte0.push_bits("110") != 0 )
		printf("no hay lugar, queda lugar para %d bits\n", byte0.bitsLibres());

	byte0.push_bits("1");

	archivo.escribirByte(byte0);

	archivo.cerrar();

	return PASA;
}

int testLeerByteCorrectamente() {
	Byte byte;
	Archivo archivo("bytesTest.txt"); archivo.abrir();

	archivo.leerByte(byte);

	std::string bits;

	byte.pop_bits(bits, 7);

	std::bitset<8> bits_set(bits);

	std::cout << bits << '\n';
	printf("byte leido: %d \n", (int)bits_set.to_ulong());

	byte.resetear();
	byte.push_bits("11010");
	bits.clear();
	byte.pop_bits(bits, 5);

	std::cout << "bits:" <<  bits << '\n';

	archivo.cerrar();

	return PASA;
}

int testEscribirBloqueCorrectamente() {
	Archivo archivo("harrypotter2.txt");
	unsigned int tamano_bloque = 128; // tamanio en bytes

	Bloque unBloque(tamano_bloque);

	archivo.abrir();
	archivo.leerBloque(unBloque);
	archivo.cerrar();

	Archivo aux("bloque.txt");
	aux.abrir();
	aux.escribirBloque(unBloque);
	aux.cerrar();

	Bloque otroBloque(tamano_bloque);
	aux.abrir();
	aux.leerBloque(otroBloque);
	aux.cerrar();

	if( unBloque.compararCon(otroBloque) == 0 ){
		return PASA;
	}else{
		return FALLA;
	}
}

int testLeerBloqueCorrectamente() {
	Archivo archivo("harrypotter2.txt");
	unsigned int tamano_bloque = 128; // tamanio en bytes

	Bloque unBloque(tamano_bloque);

	archivo.abrir();
	if( archivo.leerBloque(unBloque) ){
		archivo.cerrar();
		//unBloque.imprimir();
		return PASA;
	}else{
		archivo.cerrar();
		return FALLA;
	}
}

int testAbreCorrectamente() {
	Archivo archivo("harrypotter2.txt");

	if( archivo.abrir() ){
		archivo.cerrar();
		return PASA;
	}else{
		return FALLA;
	}
}

void TestArchivo::correrTests() {
	std::cout << "TestArchivo:" << std::endl;
	if( testAbreCorrectamente() == PASA ){
		std::cout << "abre correctamente OK" << std::endl;
	}else{
		std::cout << "abre correctamente FAIL" << std::endl;
	}

	if( testLeerBloqueCorrectamente() == PASA ){
		std::cout << "leer bloque correctamente OK" << std::endl;
	}else{
		std::cout << "leer bloque correctamente FAIL" << std::endl;
	}

	if( testEscribirBloqueCorrectamente() == PASA ){
		std::cout << "escribe bloque correctamente OK" << std::endl;
	}else{
		std::cout << "escribe bloque correctamente FAIL" << std::endl;
	}

	if( testEscribirByteCorrectamente() == PASA ){
		std::cout << "escribe byte correctamente OK" << std::endl;
	}else{
		std::cout << "escribe byte correctamente FAIL" << std::endl;
	}

	if( testLeerByteCorrectamente() == PASA ){
		std::cout << "lee byte correctamente OK" << std::endl;
	}else{
		std::cout << "lee byte correctamente FAIL" << std::endl;
	}

}
